package com.hanlin.tank;

import java.awt.*;

/**
 * 子弹类
 * @Author: hl.yuan
 * @Date: 2022/2/4 14:26
 */
public class Bullet {
    /**
     * 构造方法
     * @param x
     * @param y
     * @param dir
     */
    public Bullet(int x, int y, Dir dir,Group group,TankFrame tf) {
        this.x = x;
        this.y = y;
        this.dir = dir;
        this.group = group;
        this.tf = tf;

        rectangle.x = this.x;
        rectangle.y = this.y;
        rectangle.width = GlobalVariables.bulletW;
        rectangle.height = GlobalVariables.bulletH;
    }

    /**
     * 子弹坐标
     */
    private int x;
    /**
     * 子弹坐标
     */
    private int y;
    /**
     * 子弹的方向
     */
    private Dir dir;

    /**
     * 子弹的速度
     */
    private static final int SPEED = 10;
    /**
     * 子弹是否还活着：true：还活着，false死亡了：意思就是飞出了屏幕外，或者打到了目标身上
     */
    private  boolean living = true;

    private TankFrame tf = null;
    /**
     * 子弹的敌我标识
     */
    private Group group = Group.BAD;


    Rectangle rectangle = new Rectangle();

    /**
     * 画出子弹
     * @param g 画笔
     */
    public void paint(Graphics g) {
        if (!living) {
            // 精华：这里我们可以把传入this，其实就是把当前子弹对象给放进去，然后进行删除
            tf.bulletList.remove(this);
        }
//        // 设置子弹的颜色
//        g.setColor(Color.red);
//        /**
//         * X: 坐标
//         * Y: 坐标
//         */
//        g.fillRect(x+15, y-5, 20, 20);

        if (dir.equals(Dir.LEFT)) {
            g.drawImage(PropertyMgr.bulletL, x, y, null);
        }
        // 上键
        if (dir.equals(Dir.UP)) {
            g.drawImage(PropertyMgr.bulletU, x, y, null);
        }
        // 右键
        if (dir.equals(Dir.RIGHT)) {
            g.drawImage(PropertyMgr.bulletR, x, y, null);
        }
        // 下键
        if (dir.equals(Dir.DOWN)) {
            g.drawImage(PropertyMgr.bulletD, x, y, null);
        }


        move();
    }

    /**
     * 子弹移动
     */
    private void move() {
        // 左键
        if (dir.equals(Dir.LEFT)) {
            x -= SPEED;
        }
        // 上键
        if (dir.equals(Dir.UP)) {
            y -= SPEED;
        }
        // 右键
        if (dir.equals(Dir.RIGHT)) {
            x += SPEED;
        }
        // 下键
        if (dir.equals(Dir.DOWN)) {
            y += SPEED;
        }

        if (x<0 || y<0 || x>GlobalVariables.GAME_WIDTH || y>GlobalVariables.GAME_HEIGHT) {
            living = false;
        }

        rectangle.x = this.x;
        rectangle.y = this.y;
    }

    /**
     * 判断子弹是否和坦克相撞
     * @param tank
     */
    public void collideWith(Tank tank) {
        // 坦克的敌我标识和子弹的敌我标识是一样的，说明自己人发射的
        if (this.group==tank.getGroup()) {
            return;
        }
        // 如果子弹和坦克相撞
        if (this.rectangle.intersects(tank.rectangle)) {
            // tank死亡
            tank.die();
            // 子弹死亡
            this.die();
            // 坦克死亡的时候，发生爆炸 ps:爆炸的位置应该是坦克的位置，加上二分之一的坦克宽度
            int ex = tank.getX() + GlobalVariables.tankW / 2 - GlobalVariables.explodeW / 2;
            int ey = tank.getY() + GlobalVariables.tankH / 2 - GlobalVariables.explodeH / 2;
            tf.explodes.add(new Explode(ex, ey, this.tf));
        }
    }

    /**
     * 子弹死亡
     */
    private void die() {
        this.living = false;
    }
}
